package com.cmdi.feign;

import feign.Response;
import feign.Util;
import feign.codec.ErrorDecoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;

/**
 * @Description: Feign解析异常信息
 * @Author: gaozb
 * 当feign调用远程服务时，如果服务返回的状态码不是200，就会进入到Feign的ErrorDecoder中。
 * 如果要解析异常信息，就要重写ErrorDecoder，将远程服务返回的错误信息捕捉并处理。
 */
@Configuration
public class KeepErrMsgConfiguration {
    @Bean
    public ErrorDecoder errorDecoder() {
        return new UserErrorDecoder();
    }

    class UserErrorDecoder implements ErrorDecoder {
        @Override
        public Exception decode(String methodKey, Response response) {
            try {

                String s = Util.toString(response.body().asReader());
                //此处返回一个Sentinel的BlockException异常，此时不会进入熔断，直接抛出异常由调用者处理
                //后面的CustomFeignBlockException为Throwable
                return new CustomFeignBlockException(s, new CustomFeignBlockException(null, s));
//                return new CustomFeignErrorException(parse.getString("error_description"));
            } catch (IOException e) {
                e.printStackTrace();
            }
            return decode(methodKey, response);
        }

    }
}

